package com.web.kftsdk.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.NotBlank;

import java.util.Map;

/**
 * <p>Title: KppSmsCollectReq</p>
 * <p>Description: TODO</p>
 *
 * @author xukk
 * @version 1.0
 * @date 2018/6/14
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class KppSmsCollectReq extends BaseReq {
    /**
     * 参数名称:商户身份ID
     * 可否为空：否
     * 参数描述：签约快付通的唯一用户编号,由快付通提供。
     */
    @NotBlank
    private String merchantId;

    /**
     * 参数名称:二级商户ID
     * 可否为空：是
     * 参数描述：一级商户下的二级子商户号，调用“二级商户入驻接口”生成。
     */
    private String secMerchantId;

    /**
     * 参数名称:订单编号
     * 可否为空：否
     * 参数描述：用于标识商户发起的一笔交易
     */
    @NotBlank
    private String orderNo;

    /**
     * 参数名称:终端IP
     * 可否为空：否
     * 参数描述：APP和网页支付提交用户端ip，主扫支付填调用付API的机器IP
     */
    @NotBlank
    private String terminalIp;

    /**
     * 参数名称:商品描述
     * 可否为空：否
     * 参数描述：简要概括此次交易的内容.可能会在用户App上显示
     */
    @NotBlank
    private String tradeName;

    /**
     * 参数名称:商品详情
     * 可否为空：可空
     * 参数描述：对商品的描述
     */
    private String remark;

    /**
     * 参数名称:商户方交易时间
     * 可否为空：否
     * 参数描述：此次交易在商户发发起的时间,注意此时间取值一般为商户方系统时间而非快付通生成此时间
     */
    @NotBlank
    private String tradeTime;

    /**
     * 参数名称:交易金额
     * 可否为空：否
     * 参数描述：此次交易的具体金额,单位:分,不支持小数点
     */
    @NotBlank
    private String amount;

    /**
     * 参数名称:币种
     * 可否为空：否
     * 参数描述：指定交易所使用的币种,具体见第5.3.2章节
     */
    @NotBlank
    private String currency;

    /**
     * 参数名称:客户银行账户行别
     * 可否为空：否
     * 参数描述：客户银行账户所属的银行的编号,具体见第5.3.3章节
     */
    @NotBlank
    private String custBankNo;

    /**
     * 参数名称:客户银行账户号
     * 可否为空：否
     * 参数描述：本次交易中,从客户的哪张卡上扣钱
     */
    @NotBlank
    private String custBankAccountNo;

    /**
     * 参数名称:客户开户时绑定手机号
     * 可否为空：可空
     * 参数描述：对于有些银行账户被扣款时，需要提供此绑定手机号才能进行交易；此手机号和短信通知客户的手机号可以一致，也可以不一致
     */
    private String custBindPhoneNo;

    /**
     * 参数名称:客户姓名
     * 可否为空：否
     * 参数描述：收钱钱的客户的真实姓名
     */
    @NotBlank
    private String custName;

    /**
     * 参数名称:客户银行账户类型
     * 可否为空：可空
     * 参数描述：指客户的银行账户是个人账户还是企业账户
     */
    private String custBankAcctType;

    /**
     * 参数名称:客户账户借记贷记类型
     * 可否为空：否
     * 参数描述：若是信用卡，则以下两个参数“信用卡有效期”和“信用卡cvv2”；
     */
    @NotBlank
    private String custAccountCreditOrDebit;

    /**
     * 参数名称:客户信用卡有效期
     * 可否为空：可空
     * 参数描述：信用卡的正下方的四位数，前两位是月份，后两位是年份；
     */
    private String custCardValidDate;

    /**
     * 参数名称:客户信用卡的cvv2
     * 可否为空：可空
     * 参数描述：信用卡的背面的三位数
     */
    private String custCardCvv2;

    /**
     * 参数名称:客户证件类型
     * 可否为空：否
     * 参数描述：收钱客户的身份证件类型, 具体见第5.3.7章节
     */
    @NotBlank
    private String custCertificationType;

    /**
     * 参数名称:客户证件号码
     * 可否为空：否
     * 参数描述：与上述所选证件类型相匹配的证件号码
     */
    @NotBlank
    private String custID;

    /**
     * 参数名称:客户手机号
     * 可否为空：否
     * 参数描述：如果商户购买的产品中勾选了短信通知功能，则当商户填写了手机号时,快付通会在交易成功后通过短信通知客户
     */
    @NotBlank
    private String custPhone;

    /**
     * 参数名称:是否是S0支付
     * 可否为空：可空
     * 参数描述：是否是S0支付，1：是；0：否。默认否。如果是S0支付，金额会实时付给商户需经快付通审核通过后才可开展此业务。如果无此业务权限，此参数为1，则返回失败。
     */
    private String isS0;

    /**
     * 参数名称:是否担保
     * 可否为空：可空
     * 参数描述：是否担保交易，1：是;0：否。默认否。与isS0互斥
     */
    private String isGuarantee;

    /**
     * 参数名称:是否分账
     * 可否为空：可空
     * 参数描述：是否分账交易，1：是;0：否。默认否。
     */
    private String isSplit;

    /**
     * 参数名称:分账详情
     * 可否为空：可空
     * 参数描述：如果是分账交易必填。示例：[{\"merchantId\":\"000010001000000161\",\"amount\":\"100\",\"remark\":\"有线电视费\"},
     */
    private String splitInfo;

    @Override
    public Map toMap(String service) {
        Map<String,String>  map=super.toMap(service);
        map.put("merchantId",merchantId);
        map.put("secMerchantId",secMerchantId);
        map.put("orderNo",orderNo);
        map.put("terminalIp",terminalIp);
        map.put("tradeName",tradeName);
        map.put("remark",remark);
        map.put("tradeTime",tradeTime);
        map.put("amount",amount);
        map.put("currency",currency);
        map.put("custBankNo",custBankNo);
        map.put("custBankAccountNo",custBankAccountNo);
        map.put("custBindPhoneNo",custBindPhoneNo);
        map.put("custName",custName);
        map.put("custBankAcctType",custBankAcctType);
        map.put("custAccountCreditOrDebit",custAccountCreditOrDebit);
        map.put("custCardValidDate",custCardValidDate);
        map.put("custCardCvv2",custCardCvv2);
        map.put("custCertificationType",custCertificationType);
        map.put("custID",custID);
        map.put("custPhone",custPhone);
        map.put("isS0",isS0);
        map.put("isGuarantee",isGuarantee);
        map.put("isSplit",isSplit);
        map.put("splitInfo",splitInfo);
        return map;
    }
}
